<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright ( c ) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件

// 应用公共文件
//当函数不存在的时候才去创建
if ( !function_exists( 'randstr' ) ) {
    /**
    * 获得随机字符串
    * @param $len             需要的长度
    * @param $special        是否需要特殊符号
    * @return string       返回随机字符串
    */

    function randstr( $len = 8, $special = false ) {
        $chars = array(
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
            'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
            'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
            'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
            'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2',
            '3', '4', '5', '6', '7', '8', '9'
        );

        if ( $special ) {
            $chars = array_merge( $chars, array(
                '!', '@', '#', "$", '?', '|', '{', '/', ':', ';',
                '%', '^', '&', '*', '(', ')', '-', '_', '[', ']',
                '}', '<', '>', '~', '+', '=', ',', '.'
            ) );
        }

        $charsLen = count( $chars ) - 1;
        shuffle( $chars );
        //打乱数组顺序
        $str = '';
        for ( $i = 0; $i<$len; $i++ ) {
            $str .= $chars[ mt_rand( 0, $charsLen ) ];
            //随机取出一位
        }
        return $str;
    }
}

/**
* $to 收件人的地址
* $msg 收件内容
*/

function send( $to, $msg = '' ) {
    // var_dump( APP_PATH.'phpmail/class.phpmailer.php' );
    // var_dump( is_file( APP_PATH.'phpmail/class.phpmailer.php' ) );
    // exit;
    //引入邮件发送的类
    // APP_PATH TP常量 application
    include_once( APP_PATH.'phpmail/class.phpmailer.php' );

    //实例化这个邮箱类
    $mail = new PHPMailer( true );

    //设置发送的协议 smtp
    $mail->IsSMTP();

    //是否验证
    $mail->SMTPAuth = true;

    //设置端口  发信服务器端口号, 加密端口一般是465，普通端口25
    $mail->Port = 25;
    //465 宝塔放行 465  服务器 网络安全组 入\出

    //设置第三方服务
    $mail->Host = 'smtp.qq.com';
    // ssl://smtp.163.com 开启openssl服务 宝塔默认开启

    //设置第三方的账号密码 密码不是登录密码，是授权密码
    $mail->Username   = '2419498185@qq.com';
    $mail->Password   = 'gleenporsvfjdjic';

    //回复人
    $mail->AddReplyTo( '2419498185@qq.com', 'Fly官方社区' );

    $mail->From       = '2419498185@qq.com';
    //发件人地址
    $mail->FromName   = 'Fly官方社区';
    //发件人名称

    //添加收件人
    $mail->AddAddress( $to );

    $mail->Subject  = 'Fly论坛邮箱认证';
    //邮件主题

    //设置多少个字符换行 80字符
    $mail->WordWrap   = 80;

    // ssl协议
    // $mail->SMTPSecure = 'ssl';

    $mail->MsgHTML( $msg );
    //发送内容

    //发送的内容里面是否允许发送带html的
    $mail->IsHTML( true );

    //成功发送返回true 失败返回false
    return $mail->Send();
}

/* 图片上传 */

function upload( $name = 'img' ) {
    // 获取表单上传来的文件 例如上传了01.jepg
    $file = request()->file( $name );

    if ( $file ) {
        // 将图片移动到 框架应用目录 /public/uploads/ 目录下
        $info = $file->validate( [ 'ext' => 'jpg,png,gif,jpeg' ] )->move( ROOT_PATH.'public'.DS.'uploads' );
        if ( $info ) {

            //返回路径+文件名
            return str_replace( '\\', '/', $info->getSaveName() );
        }
        return false;
    }
    return false;
}

/* 多个图片上传 */

function uploads( $name = 'img' ) {
    // 获取表单上传来的文件 例如上传了01.jepg
    $files = request()->file( $name );
    $res = [];
    foreach ( $files as $file ) {
        // 将图片移动到 框架应用目录 /public/uploads/ 目录下
        $info = $file->validate( [ 'ext' => 'jpg,png,gif,jpeg' ] )->move( ROOT_PATH.'public'.DS.'uploads' );
        if ( $info ) {
            //返回路径+文件名
            $res[] = str_replace( '\\', '/', $info->getSaveName() );
        }
    }
    if ( count( $res ) >= 1 ) {
        return $res;
    } else {
        return false;
    }
}

/*
创建一个公共的函数，来处理评论的递归 处理数据
$list: 评论数据
$pid: 父级，0：表示第一层
$User: 用户信息
*/

function CommentTree( $list, $pid = 0, $User ) {
    $data = [];

    if ( $list ) {

        // 循环$list
        foreach ( $list as $item ) {

            // 处理呗点赞过的评论
            if ( !empty( $item[ 'like' ] ) ) {

                // 计算评论点赞数量
                $LikeArr = explode( ',', $item[ 'like' ] );
                // 将“like”的字符串转换为数组
                $LikeArr = array_filter( $LikeArr );
                // 将数组中空的数组去除
                $likeCount = is_array( $LikeArr ) ? count( $LikeArr ) : 0;
                // 计算数组的长度
                $item[ 'like_count' ] = $likeCount;
                // 添加元素 “like_count => $LikeCount” 点赞的总数

                // 判断当前这一条评论有没有被 现在登陆的人 点赞过
                if ( in_array( $User[ 'id' ], $LikeArr ) ) {
                    $item[ 'active' ] = true;
                } else {
                    $item[ 'active' ] = false;
                }
            } else {
                // 若没有人点赞，设置点赞人数为 0
                $item[ 'like_count' ] = 0;
            }

            // 判断是否是最高一级，是的话就往下一级递归
            if ( $item[ 'pid' ] == $pid ) {
                // 给数组添加新的元素
                $item[ 'child' ] = CommentTree( $list, $item[ 'id' ], $User );
                $data[] = $item;
                // 拿到的结果
            }
        }
    }
    return $data;
}

/*
处理帖子递归，循环输出
$list: 全部的评论数据
$post: 帖子详情信息
$flag: 楼主，第一个评价的人
$output: 全部的评论信息html代码
*/

function CommentHtml( $list, $post, $flag = 'top', $output = '' ) {
    foreach ( $list as $key => $item ) {

        // 设置外边距
        $PaddingLeft = $item[ 'level' ] * 3;

        /* <li> 标签的开始 设置了 li的左边的内边距 */
        $output .= "<li style='padding-left:{$PaddingLeft}em' class='jieda-daan'>";

        /* <div> 评论人的基本信息     */
        $output .= "<div class='detail-about detail-about-reply'>";

        // 头像
        //            评论人的头像处理
        $url = url( 'home/user/index', [ 'userid' => $item[ 'userid' ] ] );
        // 设置头像的跳转链接url，可以跳转到用户的主页

        /* <a> 评论人的头像链接       */
        $output .= "<a class='fly-avatar' href='$url'>";

        //                  判断头像是否存在，不存在使用默认头像
        if ( is_file( $item[ 'user' ][ 'avatar' ] ) ) {
            $avatar = $item[ 'user' ][ 'avatar' ];
            // <img/> 放入用户头像地址
            $output .= "<img src='/$avatar' />";
        } else {
            // <img/> 放入默认的头像地址
            $output .= "<img src='/assets/home/images/default.jpeg' />";
        }

        /* <a/> 头像链接的结束标签     */
        $output .= '</a>';

        // 用户信息
        /* <div> 用户信息封装开始   */
        $output .= "<div class='fly-detail-user'>";

        /* <a> 用户昵称  */
        $output .= "<a href='javascript:void(0)' class='fly-link'>";

        /* <cite>用户昵称</cite> */
        $nickname = $item[ 'user' ][ 'nickname' ];
        $output .= "<cite>$nickname</cite>";

        // 认证信息处理
        if ( $item[ 'user' ][ 'auth' ] > 0 ) {
            $output .= "<i class='iconfont icon-renzheng'></i>";
        }

        /* </a>用户昵称结束  */
        $output .= '</a>';

        // 判断是否是楼主信息处理
        if ( $key == 0 && $flag == 'top' ) {
            /* <span>楼主是否？</span>  */
            $output .= "<span style='color: #FF7200'>(楼主)</span>";
        }

        // 判断是否为发帖人处理
        if ( $item[ 'userid' ] === $post[ 'userid' ] ) {
            /* <span>是否是发帖人？</span>      */
            $output .= "<span style='color:#5FB878'>(发帖人)</span>";
        }

        /* </div> 用户信息封装结束 */
        $output .= '</div>';

        /* <div><span>评论时间</span></div> */
        $output .= "<div class='detail-hits'>";
        $output .= "<span>{$item['createtime']}</span>";
        $output .= '</div>';

        // 是否显示已采纳的图片处理
        if ( $item[ 'accept' ] == 1 ) {
            /* <i>图标</i> */
            $output .= "<i class='iconfont icon-caina' id='noaccept' data-comid='{$item['id']}' title='已收纳'></i>";
        }

        /*  </div> 全部用户信息结束标签 */
        $output .= '</div>';

        /*  <div><p>评论内容</p></div> */
        $output .= "<div class='detail-body jieda-body photos'>";
        $output .= "<p>{$item['content']}</p>";
        $output .= '</div>';

        // 其他功能操作( 如果是登陆的用户可以操作 )
        if ( cookie( 'LoginUser' ) ) {
            /*  <div> 回复信息 */
            $output .= "<div class='jieda-reply'>";

            // 判断本登陆的用户是否点赞过
            if ( isset( $item[ 'active' ] ) ) {
                $output .= "<span class='jieda-zan zanok' type='zan'>";
            } else {
                $output .= "<span class='jieda-zan' type='zan'>";
            }
            // 显示点赞数量显示
            $id = $item[ 'id' ];
            $output .= "<i class='iconfont icon-zan thumbs' data-id='$id'></i>";
            /* 显示点赞的数量 */
            $output .= "<em>{$item['like_count']}</em>";
            $output .= '</span>';

            // 回复按钮操作
            if ( !$post[ 'accept' ] ) {
                $pid = $item[ 'id' ];
                $nickname2 = $item[ 'user' ][ 'nickname' ];
                $output .= "<a href='#comment' class='reply' type='reply' data-pid='$pid' data-nickname='$nickname2'>";
                $output .= "<i class='iconfont icon-svgmoban53'></i>\r\n回复";
                $output .= '</a>';
            }

            /* <div> 其他按钮操作 */
            $output .= "<div class='jieda-admin'>";

            // 获取登陆用户的id
            $userid = cookie( 'LoginUser' )[ 'id' ];

            // 删除按钮
            // 发帖人 === 登陆人 || 评论人 === 登陆人   >> 我发的帖子我想删谁我就删谁 || 我的评论我想删就删
            if ( $userid == $post[ 'userid' ] || $userid == $item[ 'userid' ] ) {
                if ( !$post[ 'accept' ] ) {
                    $output .= "<span type='del' onclick='delComment(".$item[ 'id' ].")'>删除</span>";
                }
            }

            // 采纳按钮
            if ( $userid == $post[ 'userid' ] ) {
                if ( !$post[ 'accept' ] ) {
                    $output .= "<span class='accept' data-comid='{$item['id']}' class='jieda-accept' type='accept'>采纳</span>";
                }
            }

            /* </div> 其他按钮操作结束 */
            $output .= '</div>';

            $output .= '</div>';
        }

        /* </li> 结束 */
        $output .= '</li>';

        // 判断是否有子集
        if ( !empty( $item[ 'child' ] ) ) {
            $output = CommentHtml( $item[ 'child' ], $post, 'son', $output );
        }

    }

    return $output;
}

/*
评论删除
*/

function CommentDel( $list ) {

    // 获取评论的id
    $pid = $list[ 'id' ];

    // 通过id来寻找评论表中是否有一样的pid
    $childrenInfo = $this->CommentModel->where( [ 'pid' => $pid ] )->find();

    return $childrenInfo;

}

if ( !function_exists( 'build_code' ) ) {

    /**
    * 生成唯一订单号
    *
    * @param string $path 指定的path
    * @return string
    */

    function build_code( $prefix = '' )
 {
        @date_default_timezone_set( 'PRC' );
        $order_id_main = date( 'YmdHis' ) . rand( 10000, 99999 );
        //订单号码主体长度
        $order_id_len = strlen( $order_id_main );
        $order_id_sum = 0;
        for ( $i = 0; $i < $order_id_len; $i++ ) {
            $order_id_sum += ( int )( substr( $order_id_main, $i, 1 ) );
        }
        //唯一订单号码（YYYYMMDDHHIISSNNNNNNNNCC）
        $osn = $prefix.$order_id_main . str_pad( ( 100 - $order_id_sum % 100 ) % 100, 2, '0', STR_PAD_LEFT );
        //生成唯一订单号
        return $osn;
    }
}
